// 顺序栈
#include<stdio.h>
#include<stdlib.h>
#define Size 5 //顺序表元素空间大小
#define Maxsize 20
// 定义表结构
typedef struct Stack{
    /* data */
    int *head; //基地址
    int size; //栈中每个元素存储空间的大小
    int top; //栈顶指针
}stack;
// 栈的初始化
stack InitStack(){
    stack t;
    t.head = (int*)malloc(Size*sizeof(int));
    if(!t.head){
        printf("申请地址失败\n");
        exit(0);
    }
    t.size = Size;
    t.top = 0;
    printf("顺序栈申请成功\n");
    return t;
}
// 进栈
stack Push(stack s,int c){
    if(s.top == Maxsize){
        printf("栈已经满了\n");
        exit(0);
    }
    s.head[s.top] = c;
    s.top += 1;
    printf("进栈成功\n");
    return s;
}
// 退栈
stack Pop(stack s){
    if (s.top==0)
    {
        printf("栈为空\n");
        exit(0);
    }
    s.top -= 1;
    printf("退栈成功\n");
    return s;
}
// 读栈顶
int Top(stack s){
    if (s.top==0)
    {
        printf("栈为空\n");
        exit(0);
    }
    return s.head[s.top-1];
}
// 判空
int Empty(stack s){
    if(s.top==0){
        return 1;
    }
    return 0;
}
void main(){
    // 初始化
    stack s = InitStack();
    // 进栈
    for(int i=0;i<5;i++){
        s = Push(s,i);
    }
    // 退栈
    s = Pop(s);
    // 读栈顶
    printf("%d\n",Top(s));
    // 判空
    if(Empty(s)==0){
        printf("栈非空\n");
    }
    else
    {
        printf("栈为空\n");
    }
}